unit u_punkt;

interface

uses Graphics, ExtCtrls;   // In dieser Bibliotheken sind TCanvas
                          // und TImage definiert

type
   T_Punkt = class(TObject)

      procedure fahren(Sender:Tobject);

   protected  // Variablen und Methoden in der erbenden Klasse sichtbar
              // private beschränkt den Zugriff auf die aktuelle Unit

      x_ol : integer;   //Koordinaten des Punktes
      y_ol : integer;   //    -- " --

      isVisible : boolean;

      Leinwand : TImage;  // Zeichenort des Punktes

      x_alt : integer;  //Speichert die vorherigen
      y_alt : integer;  //Positionen der Maus

      fx : integer;  //Variablen, die die Koordinaten bei
      fy : integer;  //zeitlicher Änderung beschreiben

      t_fahren : TTimer;  //Timer von Delphi, der die
                          //Zeiten für die Änderung der
                          //Koordinaten vorgibt;

      status : integer;  // speichert den aktuellen Status des Maennchens
                            // 0 : vor Start     1 : faehrt   2 : Rand getroffen

   public
      constructor Create(x_1, y_1, b, h:integer; ort: TImage); virtual;
      procedure Zeichne; virtual;
      procedure Visible(modus:boolean);
      procedure Move(delta_x, delta_y : integer);
      procedure Lenken(maus_x,maus_y:integer);
      procedure Start;
      procedure Stopp;

   end;

implementation

{ T_Punkt }

constructor T_Punkt.Create(x_1, y_1, b, h:integer; ort: TImage);
begin
   Leinwand := ort;

   x_ol := x_1;
   y_ol := y_1;

   fx := 3;  //Default-Werte für Ortsänderungen
   fy := 3;

   t_fahren := TTimer.Create(NIL);
   t_fahren.Enabled := false; //Timer abgeschaltet -> Auto bewegt sich nicht
   t_fahren.Interval := 80;   //Aktualisierungszeit für Timer in msec
   t_fahren.OnTimer := fahren; // Angabe der Prozedur/Methode die alle
                                // 80 msec aufgerufen wird

   isVisible := false;

   status := 0;
end;


// Fahren wird alle Interval-msec aufgerufen
// und bewegt das Objekt automatisch um
// fx und fx Einheiten
procedure T_Punkt.fahren(Sender: Tobject);
begin
   Move(fx,fy);
end;


// "Lenken" wertet die Mausbewegungen aus und übertragt
// sie auf das Grafikobjekt
procedure T_Punkt.Lenken(maus_x, maus_y: integer);
begin
   // Die aktuellen Mauskoordinaten werden
   // mit den Koordinaten von "kurz vorher"
   // verglichen und daraus die Bewegung
   // ermittelt

   if maus_x > x_alt then   //Maus wurde nach rechts bewegt
      move(3,0);

   if maus_x < x_alt then   //Maus wurde nach links bewegt
      move(-3,0);

   if maus_y > y_alt then   //Maus wurde nach unten bewegt
      move(0,3);

   if maus_y < y_alt then  //Maus wurde nach oben bewegt
      move(0,-3);

   x_alt := maus_x;  //Akuelle Mauskoordianten werden für
   y_alt := maus_y;  //nächsten Vergleich gespeichert
end;

procedure T_Punkt.Move(delta_x, delta_y: integer);
begin
   Visible(false);   // Grafikobjekt wird unsichtbar auf der Zeichenfläche

      x_ol := x_ol + delta_x;   // Grafikobjekt bekommt neue Ursprungskoordinaten
      y_ol := y_ol + delta_y;   // zugewiesen

   Visible(true);   // Grafikobjekt wieder anzeigen
end;

// Timer einschalten -> Bewegung
procedure T_Punkt.Start;
begin
   t_fahren.Enabled := true;

   status :=  1;
end;

// Timer ausschalten -> Stopp
procedure T_Punkt.Stopp;
begin
   t_fahren.Enabled := false;

//   status :=  2;
end;

procedure T_Punkt.Visible(modus: boolean);
begin
   if modus <> isVisible then
   begin
      Zeichne;
      isVisible := modus;
   end;
end;

procedure T_Punkt.Zeichne;
begin
//   Leinwand.Rectangle(x_ol,y_ol,x_ol,y_ol);
   Leinwand.canvas.pixels[x_ol,y_ol] := clblack
end;

end.
